Reactã®é
å»¶èªã¿èŸŒã¿ïŒããã©ãŒãã³ã¹ãæé©åããã³ã³ããŒãã³ãã®ã³ãŒãåå² | MLOG | MLOG 2025幎8æ16æ¥ æ¥æ¬èª
é
å»¶èªã¿èŸŒã¿ãšã³ã³ããŒãã³ãã®ã³ãŒãåå²ã§ãReactã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãççž®ããããã©ãŒãã³ã¹ãåäžãããŸããããå®çšçãªãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹ã解説ããŸãã
Reactã®é
å»¶èªã¿èŸŒã¿ïŒããã©ãŒãã³ã¹ãæé©åããã³ã³ããŒãã³ãã®ã³ãŒãåå²
仿¥ã®ããŒã¹ã®éãããžã¿ã«äžçã§ã¯ããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãæãéèŠã§ãããŠãŒã¶ãŒã¯å³æã®æºè¶³ãæåŸ
ããŠãããèªã¿èŸŒã¿æéãé
ããšããã©ã¹ãã¬ãŒã·ã§ã³ãã«ãŒãã®æŸæ£ããããŠãã©ã³ãã€ã¡ãŒãžã®äœäžã«ã€ãªããå¯èœæ§ããããŸããReactã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãããã©ãŒãã³ã¹ã®æé©åã¯ãã¹ã ãŒãºã§é
åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ãããããéæããããã®åŒ·åãªææ³ã®äžã€ããã³ã³ããŒãã³ãã®ã³ãŒãåå²ã䌎ãé
å»¶èªã¿èŸŒã¿ ã§ãã
é
å»¶èªã¿èŸŒã¿ãšã³ãŒãåå²ãšã¯ïŒ
é
å»¶èªã¿èŸŒã¿ ã¯ãç»åãã¹ã¯ãªãããã³ã³ããŒãã³ããªã©ã®ãªãœãŒã¹ããæåã®ããŒãžèªã¿èŸŒã¿æã«äžåºŠã«ãã¹ãŠèªã¿èŸŒãã®ã§ã¯ãªããå¿
èŠãªãšãã«ã ãèªã¿èŸŒãæè¡ã§ããããã«ãããæåã«ããŠã³ããŒãããŠè§£æããå¿
èŠãããããŒã¿éã倧å¹
ã«åæžãããåæèªã¿èŸŒã¿æéãççž®ãããäœæããã©ãŒãã³ã¹ãåäžããŸãã
ã³ãŒãåå² ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããããå°ããã管çãããããã£ã³ã¯ïŒãŸãã¯ãã³ãã«ïŒã«åå²ããããã»ã¹ã§ããããã«ããããã©ãŠã¶ã¯æåã®ãã¥ãŒã«å¿
èŠãªã³ãŒãã®ã¿ãããŠã³ããŒãããä»ã®ã³ãŒãã®èªã¿èŸŒã¿ã¯å®éã«å¿
èŠã«ãªããŸã§å»¶æã§ããŸããé
å»¶èªã¿èŸŒã¿ã¯ãã³ãŒãåå²ã掻çšããŠãç¹å®ã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããçŽåã«ã®ã¿èªã¿èŸŒã¿ãŸãã
Reactã§é
å»¶èªã¿èŸŒã¿ãšã³ãŒãåå²ã䜿çšããçç±
Reactãããžã§ã¯ãã«é
å»¶èªã¿èŸŒã¿ãšã³ãŒãåå²ãçµã¿èŸŒãããšãæ€èšãã¹ãçç±ã¯æ¬¡ã®ãšããã§ãïŒ
åæèªã¿èŸŒã¿æéã®æ¹åïŒ æåã«å¿
èŠãªã³ã³ããŒãã³ãã®ã¿ãèªã¿èŸŒãããšã§ãããŒãžãã€ã³ã¿ã©ã¯ãã£ãã«ãªããŸã§ã®æéã倧å¹
ã«ççž®ã§ããŸããããã¯ãç¹ã«ã€ã³ã¿ãŒãããæ¥ç¶ãé
ããŠãŒã¶ãŒãã¢ãã€ã«ããã€ã¹ã®ãŠãŒã¶ãŒã«ãšã£ãŠæçã§ãã
ãã³ãã«ãµã€ãºã®åæžïŒ ã³ãŒãåå²ã«ãããæåã®JavaScriptãã³ãã«ã®ãµã€ãºãå°ãããªããããŠã³ããŒããšè§£ææéãççž®ãããŸãã
ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒ èªã¿èŸŒã¿ã®éããŠã§ããµã€ãã¯ãããã¹ã ãŒãºã§æ¥œãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãããšã³ã²ãŒãžã¡ã³ããšã³ã³ããŒãžã§ã³çã®åäžã«ã€ãªãããŸãã
ããŒãšã³ãããã€ã¹ã§ã®ããã©ãŒãã³ã¹åäžïŒ é
å»¶èªã¿èŸŒã¿ã¯ãåŠçèœåãã¡ã¢ãªãéãããŠããããã€ã¹ã§ã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžãããããšãã§ããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³å
šäœãæåã«èªã¿èŸŒãã§åŠçããå¿
èŠããªãããã§ãã
SEOäžã®ã¡ãªããïŒ æ€çŽ¢ãšã³ãžã³ã¯èªã¿èŸŒã¿æéãéããŠã§ããµã€ããåªå
ãããããé
å»¶èªã¿èŸŒã¿ãå®è£
ããããšã¯æ€çŽ¢ãšã³ãžã³ã©ã³ãã³ã°ã«ãã©ã¹ã®åœ±é¿ãäžããå¯èœæ§ããããŸãã
Reactã§é
å»¶èªã¿èŸŒã¿ãå®è£
ããæ¹æ³
Reactã¯ãReact.lazy
ãšSuspense
ã³ã³ããŒãã³ãã䜿çšããŠãé
å»¶èªã¿èŸŒã¿ãæšæºã§ãµããŒãããŠããŸãã以äžã«ã¹ããããã€ã¹ãããã®ã¬ã€ãã瀺ããŸãïŒ
1. React.lazy() ã®äœ¿çš
React.lazy()
ã䜿çšãããšãã³ã³ããŒãã³ããåçã«ã€ã³ããŒãã§ããã³ãŒããåå¥ã®ãã£ã³ã¯ã«å¹æçã«åå²ã§ããŸããããã¯ãã³ã³ããŒãã³ãã«è§£æ±ºãããPromiseãè¿ãimport()
ãåŒã³åºã颿°ãåŒæ°ã«åããŸãã
const MyComponent = React.lazy(() => import('./MyComponent'));
ãã®äŸã§ã¯ãMyComponent
ã¯ã¬ã³ããªã³ã°ãããçŽåã«ã®ã¿èªã¿èŸŒãŸããŸãã
2. <Suspense> ã§ã©ãããã
React.lazy()
ã¯éåæã§ããåçã€ã³ããŒãã䜿çšãããããé
å»¶èªã¿èŸŒã¿ãããã³ã³ããŒãã³ãã<Suspense>
ã³ã³ããŒãã³ãã§ã©ããããå¿
èŠããããŸãã<Suspense>
ã³ã³ããŒãã³ãã䜿çšãããšãã³ã³ããŒãã³ãã®èªã¿èŸŒã¿äžã«ãã©ãŒã«ããã¯UIïŒäŸïŒèªã¿èŸŒã¿ã¹ãããŒïŒã衚瀺ã§ããŸãã
import React, { Suspense } from 'react';
function MyPage() {
return (
Loading...
}>
);
}
ãã®äŸã§ã¯ãMyComponent
ãèªã¿èŸŒãŸããŠããéãLoading...
ãšããã¡ãã»ãŒãžã衚瀺ãããŸããã³ã³ããŒãã³ããèªã¿èŸŒãŸãããšããã©ãŒã«ããã¯UIã眮ãæããããŸãã
3. å®è·µäŸïŒå€§èŠæš¡ãªç»åã®ã£ã©ãªãŒã®é
å»¶èªã¿èŸŒã¿
å€§èŠæš¡ãªç»åã®ã£ã©ãªãŒããããšããŸãããã¹ãŠã®ç»åãäžåºŠã«èªã¿èŸŒããšãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãã以äžã«ãReact.lazy()
ãš<Suspense>
ã䜿çšããŠç»åãé
å»¶èªã¿èŸŒã¿ããæ¹æ³ã瀺ããŸãïŒ
import React, { Suspense } from 'react';
const LazyImage = React.lazy(() => import('./Image'));
function ImageGallery() {
const images = [
{ id: 1, src: 'image1.jpg', alt: 'Image 1' },
{ id: 2, src: 'image2.jpg', alt: 'Image 2' },
{ id: 3, src: 'image3.jpg', alt: 'Image 3' },
// ... more images
];
return (
{images.map(image => (
Loading image...
}>
))}
);
}
export default ImageGallery;
ãããŠãImage.js
ã³ã³ããŒãã³ãã§ãïŒ
import React from 'react';
const Image = ({ src, alt }) => {
return ;
};
export default Image;
ãã®äŸã§ã¯ãåç»åã<Suspense>
ã³ã³ããŒãã³ãã§ã©ãããããŠãããããåç»åã®èªã¿èŸŒã¿äžã«èªã¿èŸŒã¿ã¡ãã»ãŒãžã衚瀺ãããŸããããã«ãããç»åã®ããŠã³ããŒãäžã«ããŒãžå
šäœããããã¯ãããã®ãé²ããŸãã
é«åºŠãªãã¯ããã¯ãšèæ
®äºé
1. ãšã©ãŒããŠã³ããª
é
å»¶èªã¿èŸŒã¿ã䜿çšããå Žåãèªã¿èŸŒã¿ããã»ã¹äžã«çºçããå¯èœæ§ã®ãããšã©ãŒãåŠçããããšãéèŠã§ãããšã©ãŒããŠã³ããªã䜿çšããŠãããã®ãšã©ãŒããã£ãããããã©ãŒã«ããã¯UIã衚瀺ã§ããŸããæ¬¡ã®ãããªãšã©ãŒããŠã³ããªã³ã³ããŒãã³ããäœæã§ããŸãïŒ
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return Something went wrong. ;
}
return this.props.children;
}
}
export default ErrorBoundary;
次ã«ã<Suspense>
ã³ã³ããŒãã³ãã<ErrorBoundary>
ã§ã©ããããŸãïŒ
Loading...}>
MyComponent
ã®èªã¿èŸŒã¿äžã«ãšã©ãŒãçºçããå Žåã<ErrorBoundary>
ãããããã£ãããããã©ãŒã«ããã¯UIã衚瀺ããŸãã
2. ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãšé
å»¶èªã¿èŸŒã¿
é
å»¶èªã¿èŸŒã¿ã¯ããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãšçµã¿åãããŠäœ¿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãæ¹åããããšãã§ããŸãããã ããããã€ãã®è¿œå èšå®ãå¿
èŠã§ãããµãŒããŒãåçã€ã³ããŒããæ£ããåŠçã§ããããšããããŠé
å»¶èªã¿èŸŒã¿ãããã³ã³ããŒãã³ããã¯ã©ã€ã¢ã³ãåŽã§é©åã«ãã€ãã¬ãŒããããããšã確èªããå¿
èŠããããŸãã
Next.jsãGatsby.jsã®ãããªããŒã«ã¯ãSSRç°å¢ã§ã®é
å»¶èªã¿èŸŒã¿ãšã³ãŒãåå²ãæšæºã§ãµããŒãããŠãããããã»ã¹ãã¯ããã«ç°¡åã«ããŸãã
3. é
å»¶èªã¿èŸŒã¿ã³ã³ããŒãã³ãã®ããªããŒã
å Žåã«ãã£ãŠã¯ãé
å»¶èªã¿èŸŒã¿ã³ã³ããŒãã³ããå®éã«å¿
èŠã«ãªãåã«ããªããŒããããããšããããŸããããã¯ãããã«ã¬ã³ããªã³ã°ãããå¯èœæ§ãé«ãã³ã³ããŒãã³ããããšãã°ç»é¢äžéšã«ããã¹ã¯ããŒã«ããŠè¡šç€ºãããå¯èœæ§ãé«ãã³ã³ããŒãã³ããªã©ã«åœ¹ç«ã¡ãŸããimport()
颿°ãæåã§åŒã³åºãããšã§ãã³ã³ããŒãã³ããããªããŒãã§ããŸãïŒ
import('./MyComponent'); // Preload MyComponent
ããã«ãããã³ã³ããŒãã³ããããã¯ã°ã©ãŠã³ãã§èªã¿èŸŒã¿éå§ããããããå®éã«ã¬ã³ããªã³ã°ããããšãã«ã¯ããè¿
éã«å©çšå¯èœã«ãªããŸãã
4. Webpackããžãã¯ã³ã¡ã³ãã䜿çšããåçã€ã³ããŒã
Webpackã®ãããžãã¯ã³ã¡ã³ããã¯ãçæãããã³ãŒããã£ã³ã¯ã®ååãã«ã¹ã¿ãã€ãºããæ¹æ³ãæäŸããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã«æ§é ã®ãããã°ãåæã«åœ¹ç«ã¡ãŸããäŸïŒ
const MyComponent = React.lazy(() => import(/* webpackChunkName: "my-component" */ './MyComponent'));
ããã«ãããæ±çšçãªååã®ä»£ããã«ãmy-component.jsãïŒãŸãã¯ããã«é¡ãããã®ïŒãšããååã®ã³ãŒããã£ã³ã¯ãäœæãããŸãã
5. ããããèœãšã穎ãé¿ãã
éå°ãªåå²ïŒ ã³ãŒããããŸãã«ãå€ãã®å°ããªãã£ã³ã¯ã«åå²ãããšãè€æ°ã®ãããã¯ãŒã¯ãªã¯ãšã¹ããè¡ããªãŒããŒãããã«ãããå®éã«ã¯ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ã«é©ãããã©ã³ã¹ãèŠã€ããŠãã ããã
äžé©åãªSuspenseã®é
çœ®ïŒ è¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«ã<Suspense>
ã®å¢çãé©åã«é
眮ãããŠããããšã確èªããŠãã ãããå¯èœã§ããã°ãããŒãžå
šäœã<Suspense>
ã§ã©ããããããšã¯é¿ããŠãã ããã
ãšã©ãŒããŠã³ããªã®å¿ãïŒ é
å»¶èªã¿èŸŒã¿äžã®æœåšçãªãšã©ãŒãåŠçããããã«ãåžžã«ãšã©ãŒããŠã³ããªã䜿çšããŠãã ããã
å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
é
å»¶èªã¿èŸŒã¿ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããã«ãããŸããŸãªã·ããªãªã«é©çšã§ããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
Eã³ããŒã¹ãµã€ãïŒ ååç»åãåç»ã詳现ãªåå説æãé
å»¶èªã¿èŸŒã¿ããããšã§ãååããŒãžã®åæèªã¿èŸŒã¿æéã倧å¹
ã«æ¹åã§ããŸãã
ããã°ããã¥ãŒã¹ãµã€ãïŒ ç»åãåã蟌ã¿åç»ãã³ã¡ã³ãã»ã¯ã·ã§ã³ãé
å»¶èªã¿èŸŒã¿ããããšã§ãèªæžäœéšãåäžãããçŽåž°çãæžããããšãã§ããŸãã
ããã·ã¥ããŒããšç®¡çããã«ïŒ è€éãªãã£ãŒããã°ã©ããããŒã¿ããŒãã«ãé
å»¶èªã¿èŸŒã¿ããããšã§ãããã·ã¥ããŒãã管çããã«ã®å¿çæ§ãåäžãããããšãã§ããŸãã
ã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒïŒ ã«ãŒããã³ã³ããŒãã³ããé
å»¶èªã¿èŸŒã¿ããããšã§ãSPAã®åæèªã¿èŸŒã¿æéãççž®ããå
šäœçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããšãã§ããŸãã
åœéå察å¿ã¢ããªã±ãŒã·ã§ã³ïŒ ãŠãŒã¶ãŒã®èšèªã«åãããŠå¿
èŠãªãã±ãŒã«åºæã®ãªãœãŒã¹ïŒããã¹ããç»åãªã©ïŒã®ã¿ãèªã¿èŸŒã¿ãŸããããšãã°ããã€ãã®ãŠãŒã¶ãŒã«ã¯ãã€ãèªã®ç¿»èš³ããã¹ãã€ã³ã®ãŠãŒã¶ãŒã«ã¯ã¹ãã€ã³èªã®ç¿»èš³ãèªã¿èŸŒã¿ãŸãã
äŸïŒåœéçãªEã³ããŒã¹ãµã€ã
äžçäžã«ååã販売ããEã³ããŒã¹ãµã€ããæ³åããŠã¿ãŠãã ãããåœã«ãã£ãŠé貚ãèšèªãååã«ã¿ãã°ãç°ãªãå ŽåããããŸãããã¹ãŠã®åœã®ããŒã¿ãæåã«èªã¿èŸŒã代ããã«ãé
å»¶èªã¿èŸŒã¿ã䜿çšããŠããŠãŒã¶ãŒããµã€ãã蚪ãããšãã«ãã®å Žæåºæã®ããŒã¿ã®ã¿ãèªã¿èŸŒãããšãã§ããŸãã
const CurrencyFormatter = React.lazy(() => import(`./CurrencyFormatter/${userCountry}`))
const ProductCatalog = React.lazy(() => import(`./ProductCatalog/${userCountry}`))
function ECommerceSite() {
const userCountry = getUserCountry(); // Function to determine user's country
return (
Loading content for your region...}>
);
}
çµè«
é
å»¶èªã¿èŸŒã¿ãšã³ã³ããŒãã³ãã®ã³ãŒãåå²ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã®åŒ·åãªãã¯ããã¯ã§ããã³ã³ããŒãã³ããå¿
èŠãªãšãã«ã®ã¿èªã¿èŸŒãããšã§ãåæèªã¿èŸŒã¿æéã倧å¹
ã«ççž®ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããSEOã匷åããããšãã§ããŸããReactã«çµã¿èŸŒãŸããŠããReact.lazy()
ãš<Suspense>
ã³ã³ããŒãã³ãã«ããããããžã§ã¯ãã«é
å»¶èªã¿èŸŒã¿ãç°¡åã«å®è£
ã§ããŸãããããã®ãã¯ããã¯ã掻çšããŠãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ãããéããããå¿çæ§ãé«ããããé
åçãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãããã
é
å»¶èªã¿èŸŒã¿ãå®è£
ããéã«ã¯ãåžžã«ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãèæ
®ããããšãå¿ããªãã§ãã ãããæ
å ±ã«åºã¥ãããã©ãŒã«ããã¯UIãæäŸããæœåšçãªãšã©ãŒãé©åã«åŠçããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæ³šææ·±ãåæããŠãæãŸããçµæãåŸãããŠããããšã確èªããŠãã ãããããŸããŸãªã¢ãããŒãã詊ãããšãæãããç¹å®ã®ããŒãºã«æé©ãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããŠãã ããã